//package com.waa.gulimall.order.service.impl;
//
//import com.baomidou.mybatisplus.core.toolkit.IdWorker;
//import com.waa.gulimall.common.utils.R;
//import com.waa.gulimall.common.vo.MemberRespVo;
//import com.waa.gulimall.order.constant.OrderConstant;
//import com.waa.gulimall.order.entity.OrderEntity;
//import com.waa.gulimall.order.entity.OrderItemEntity;
//import com.waa.gulimall.order.vo.*;
//import org.springframework.data.redis.core.script.DefaultRedisScript;
//import org.springframework.transaction.annotation.Transactional;
//import org.springframework.util.StringUtils;
//
//import java.math.BigDecimal;
//import java.util.Arrays;
//import java.util.List;
//import java.util.stream.Collectors;
//
//public class TextDemo {
//    @Transactional
//
//    public SubmitOrderResponseVo submitOrder(OrderSubmitVo vo) {
//        // 先将参数放到共享变量中，方便之后方法使用该参数
//        confirmVoThreadLocal.set(vo);
//        // 接收返回数据
//        SubmitOrderResponseVo response = new SubmitOrderResponseVo();
//        response.setCode(0);
//        // 通过拦截器拿到用户的数据
//        MemberRespVo memberRespVo = LoginInterceptor.loginUser.get();
//        /**
//         * 不使用原子性验证令牌
//         *      1、用户带着两个订单，提交速度非常快，两个订单的令牌都是123，去redis里面查查到的也是123。
//         *          两个对比都通过，然后来删除令牌，那么就会出现用户重复提交的问题，
//         *      2、第一次差的快，第二次查的慢，只要没删就会出现这些问题
//         *      3、因此令牌的【验证和删除必须保证原子性】
//         *      String orderToken = vo.getOrderToken();
//         *      String redisToken = redisTemplate.opsForValue().get(OrderConstant.USER_ORDER_TOKEN_PREFIX + memberRespVo.getId());
//         *         if (orderToken != null && orderToken.equals(redisToken)) {
//         *             // 令牌验证通过 进行删除
//         *             redisTemplate.delete(OrderConstant.USER_ORDER_TOKEN_PREFIX + memberRespVo.getId());
//         *         } else {
//         *             // 不通过
//         *         }
//         */
//        // 验证令牌【令牌的对比和删除必须保证原子性】
//        // 因此使用redis中脚本来进行验证并删除令牌
//        // 0【删除失败/验证失败】 1【删除成功】
//        String script = "if redis.call('get',KEYS[1]) == ARGV[1] then return redis.call('del',KEYS[1]) else return 0 end";
//        /**
//         * redis lur脚本命令解析
//         * if redis.call('get',KEYS[1]) == ARGV[1] then return redis.call('del',KEYS[1]) else return 0 end
//         *  1、redis调用get方法来获取一个key的值，如果这个get出来的值等于我们传过来的值
//         *  2、然后就执行删除，根据这个key进行删除，删除成功返回1，验证失败返回0
//         *  3、删除否则就是0
//         *  总结：相同的进行删除，不相同的返回0
//         * 脚本大致意思
//         */
//        // 拿到令牌
//        String orderToken = vo.getOrderToken();
//        /**
//         * 	public <T> T execute(RedisScript<T> script // redis的脚本
//         * 	    , List<K> keys // 对应的key 参数中使用了Array.asList 将参数转成list集合
//         * 	    , Object... args) { // 要删除的值
//         */
//        // 原子验证和删除
//        Long result = redisTemplate.execute(new DefaultRedisScript<Long>(script, Long.class)
//                , Arrays.asList(OrderConstant.USER_ORDER_TOKEN_PREFIX + memberRespVo.getId())
//                , orderToken);
//        if (result  == 0L) { // 验证令牌验证失败
//            // 验证失败直接返回结果
//            response.setCode(1);
//            return response;
//        } else { // 原子验证令牌成功
//            // 下单 创建订单、验证令牌、验证价格、验证库存
//            // 1、创建订单、订单项信息
//            OrderCreateTo order = createOrder();
//            // 2、应付总额
//            BigDecimal payAmount = order.getOrder().getPayAmount();
//            // 应付价格
//            BigDecimal payPrice = vo.getPayPrice();
//            /**
//             * 电商项目对付款的金额精确到小数点后面两位
//             * 订单创建好的应付总额 和购物车中计算好的应付价格求出绝对值。
//             */
//            if(Math.abs(payAmount.subtract(payPrice).doubleValue()) < 0.01) {
//                // 金额对比成功 保存订单
//                saveOrder(order);
//                // 创建锁定库存Vo
//                WareSkuLockedVo wareSkuLockedVo = new WareSkuLockedVo();
//                // 准备好商品项
//                List<OrderItemVo> lock = order.getOrderItem().stream().map(orderItemEntity -> {
//                    OrderItemVo orderItemVo = new OrderItemVo();
//                    // 商品购买数量
//                    orderItemVo.setCount(orderItemEntity.getSkuQuantity());
//                    // skuid 用来查询商品信息
//                    orderItemVo.setSkuId(orderItemEntity.getSkuId());
//                    // 商品标题
//                    orderItemVo.setTitle(orderItemEntity.getSkuName());
//                    return orderItemVo;
//                }).collect(Collectors.toList());
//                // 订单号
//                wareSkuLockedVo.setOrderSn(order.getOrder().getOrderSn());
//                // 商品项
//                wareSkuLockedVo.setLocks(lock);
//                // 远程调用库存服务锁定库存
//                R r = wareFeignService.orderLockStock(wareSkuLockedVo);
//                if (r.getCode() == 0) { // 库存锁定成功
//                    // 将订单对象放到返回Vo中
//                    response.setOrder(order.getOrder());
//                    // 设置状态码
//                    response.setCode(0);
//                    // 订单创建成功发送消息给MQ
//                    rabbitTemplate.convertAndSend("order-event-exchange"
//                            ,"order.create.order"
//                            ,order.getOrder());
//                    return response;
//                } else {
//                    // 远程锁定库存失败
//                    response.setCode(3);
//                    return response;
//                }
//            } else {
//                // 商品价格比较失败
//                response.setCode(2);
//                return response;
//            }
//        }
//    }
//    /**
//     * 创建订单和订单项
//     * @return
//     */
//    private OrderCreateTo createOrder() {
//        OrderCreateTo orderCreateTo = new OrderCreateTo();
//        // 1、生成订单号
//        String orderSn = IdWorker.getTimeId();
//        // 2、构建订单
//        OrderEntity orderEntity = buildOrder(orderSn);
//        // 3、构建订单项
//        List<OrderItemEntity> itemEntities = builderOrderItems(orderSn);
//        // 4、设置价格、积分相关信息
//        computPrice(orderEntity,itemEntities);
//        // 5、设置订单项
//        orderCreateTo.setOrderItem(itemEntities);
//        // 6、设置订单
//        orderCreateTo.setOrder(orderEntity);
//        return orderCreateTo;
//    }
//    /**
//     * 构建订单
//     * @param orderSn
//     * @return
//     */
//    private OrderEntity buildOrder(String orderSn) {
//        // 拿到共享数据
//        OrderSubmitVo orderSubmitVo = confirmVoThreadLocal.get();
//        // 用户登录登录数据
//        MemberRespVo memberRespVo = LoginInterceptor.loginUser.get();
//
//        OrderEntity orderEntity = new OrderEntity();
//        // 设置订单号
//        orderEntity.setOrderSn(orderSn);
//        // 用户id
//        orderEntity.setMemberId(memberRespVo.getId());
//        // 根据用户收货地址id查询出用户的收获地址信息
//        R fare = wareFeignService.getFare(orderSubmitVo.getAddrId());
//        FareVo data = fare.getData(new TypeReference<FareVo>() {
//        });
//        //将查询到的会员收货地址信息设置到订单对象中
//        // 运费金额
//        orderEntity.setFreightAmount(data.getFare());
//        // 城市
//        orderEntity.setReceiverCity(data.getMemberAddressVo().getCity());
//        // 详细地区
//        orderEntity.setReceiverDetailAddress(data.getMemberAddressVo().getDetailAddress());
//        // 收货人姓名
//        orderEntity.setReceiverName(data.getMemberAddressVo().getName());
//        // 收货人手机号
//        orderEntity.setReceiverPhone(data.getMemberAddressVo().getPhone());
//        // 区
//        orderEntity.setReceiverRegion(data.getMemberAddressVo().getRegion());
//        // 省份直辖市
//        orderEntity.setReceiverProvince(data.getMemberAddressVo().getProvince());
//        // 订单刚创建状态设置为 待付款，用户支付成功后将该该状态改成已付款
//        orderEntity.setStatus(OrderStatusEnum.CREATE_NEW.getCode());
//        // 自动确认时间
//        orderEntity.setAutoConfirmDay(7);
//
//        return orderEntity;
//    }
//    /**
//     * 构建订单项
//     * @param orderSn
//     * @return
//     */
//    private List<OrderItemEntity> builderOrderItems(String orderSn) {
//        // 获取购物车中选中的商品
//        List<OrderItemVo> currentUserCartItem = cartFeignServicea.getCurrentUserCartItem();
//        if (currentUserCartItem != null && currentUserCartItem.size() > 0) {
//            List<OrderItemEntity> collect = currentUserCartItem.stream().map(orderItemVo -> {
//                // 构建订单项
//                OrderItemEntity itemEntity = builderOrderItem(orderItemVo);
//                itemEntity.setOrderSn(orderSn);
//                return itemEntity;
//            }).collect(Collectors.toList());
//            return collect;
//        }
//        return null;
//    }
//    /**
//     * 构建订单项信息
//     * @param cartItem
//     * @return
//     */
//    private OrderItemEntity builderOrderItem(OrderItemVo cartItem) {
//        OrderItemEntity itemEntity = new OrderItemEntity();
//        // 1、根据skuid查询关联的spuinfo信息
//        Long skuId = cartItem.getSkuId();
//        R spuinfo = productFeignService.getSpuInfoBySkuId(skuId);
//        SpuInfoVo spuInfoVo = spuinfo.getData(new TypeReference<SpuInfoVo>() {
//        });
//        // 2、设置商品项spu信息
//        // 品牌信息
//        itemEntity.setSpuBrand(spuInfoVo.getBrandId().toString());
//        // 商品分类信息
//        itemEntity.setCategoryId(spuInfoVo.getCatalogId());
//        // spuid
//        itemEntity.setSpuId(spuInfoVo.getId());
//        // spu_name 商品名字
//        itemEntity.setSpuName(spuInfoVo.getSpuName());
//
//        // 3、设置商品sku信息
//        // skuid
//        itemEntity.setSkuId(skuId);
//        // 商品标题
//        itemEntity.setSkuName(cartItem.getTitle());
//        // 商品图片
//        itemEntity.setSkuPic(cartItem.getImage());
//        // 商品sku价格
//        itemEntity.setSkuPrice(cartItem.getPrice());
//        // 商品属性以 ; 拆分
//        String skuAttr = StringUtils.collectionToDelimitedString(cartItem.getSkuAttr(), ";");
//        itemEntity.setSkuAttrsVals(skuAttr);
//        // 商品购买数量
//        itemEntity.setSkuQuantity(cartItem.getCount());
//
//        // 4、设置商品优惠信息【不做】
//        // 5、设置商品积分信息
//        // 赠送积分 移弃小数值
//        itemEntity.setGiftIntegration(cartItem.getPrice().multiply(new BigDecimal(cartItem.getCount().toString())).intValue());
//        // 赠送成长值
//        itemEntity.setGiftGrowth(cartItem.getPrice().multiply(new BigDecimal(cartItem.getCount().toString())).intValue());
//
//        // 6、订单项的价格信息
//        // 这里需要计算商品的分解信息
//        // 商品促销分解金额
//        itemEntity.setPromotionAmount(new BigDecimal("0"));
//        // 优惠券优惠分解金额
//        itemEntity.setCouponAmount(new BigDecimal("0"));
//        // 积分优惠分解金额
//        itemEntity.setIntegrationAmount(new BigDecimal("0"));
//        // 商品价格乘以商品购买数量=总金额(未包含优惠信息)
//        BigDecimal origin = itemEntity.getSkuPrice().multiply(new BigDecimal(itemEntity.getSkuQuantity().toString()));
//        // 总价格减去优惠卷-积分优惠-商品促销金额 = 总金额
//        origin.subtract(itemEntity.getPromotionAmount())
//                .subtract(itemEntity.getCouponAmount())
//                .subtract(itemEntity.getIntegrationAmount());
//        // 该商品经过优惠后的分解金额
//        itemEntity.setRealAmount(origin);
//        return itemEntity;
//    }
//    /**
//     * 计算订单涉及到的积分、优惠卷抵扣、促销优惠信息等信息
//     * @param orderEntity
//     * @param itemEntities
//     * @return
//     */
//    private OrderEntity computPrice(OrderEntity orderEntity, List<OrderItemEntity> itemEntities) {
//        // 1、定义好相关金额，然后遍历购物项进行计算
//        // 总价格
//        BigDecimal total = new BigDecimal("0");
//        //相关优惠信息
//        // 优惠卷抵扣金额
//        BigDecimal coupon = new BigDecimal("0");
//        // 积分优惠金额
//        BigDecimal integration = new BigDecimal("0");
//        // 促销优惠金额
//        BigDecimal promotion = new BigDecimal("0");
//        // 积分
//        BigDecimal gift = new BigDecimal("0");
//        // 成长值
//        BigDecimal growth = new BigDecimal("0");
//
//        // 遍历订单项将所有的优惠信息进行相加
//        for (OrderItemEntity itemEntity : itemEntities) {
//            coupon = coupon.add(itemEntity.getCouponAmount()); // 优惠卷抵扣
//            integration = integration.add(itemEntity.getIntegrationAmount()); // 积分优惠分解金额
//            promotion = promotion.add(itemEntity.getPromotionAmount()); // 商品促销分解金额
//            gift = gift.add(new BigDecimal(itemEntity.getGiftIntegration().toString())); // 赠送积分
//            growth = growth.add(new BigDecimal(itemEntity.getGiftGrowth())); // 赠送成长值
//            total = total.add(itemEntity.getRealAmount()); //优惠后的总金额
//        }
//
//        // 2、设置订单金额
//        // 订单总金额
//        orderEntity.setTotalAmount(total);
//        // 应付总额 = 订单总额 + 运费信息
//        orderEntity.setPayAmount(total.add(orderEntity.getFreightAmount()));
//        // 促销优化金额（促销价、满减、阶梯价）
//        orderEntity.setPromotionAmount(promotion);
//        // 优惠券抵扣金额
//        orderEntity.setCouponAmount(coupon);
//
//        // 3、设置积分信息
//        // 订单购买后可以获得的成长值
//        orderEntity.setGrowth(growth.intValue());
//        // 积分抵扣金额
//        orderEntity.setIntegrationAmount(integration);
//        // 可以获得的积分
//        orderEntity.setIntegration(gift.intValue());
//        // 删除状态【0->未删除；1->已删除】
//        orderEntity.setDeleteStatus(0);
//        return orderEntity;
//    }
//}
